package com.nsgf.library.utils;

import android.text.TextUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
 * 项目名称：组件化产品
 * 类名称：StringUtil
 * 描述:<字符串操作的工具类>
 * @author :xuwenjuan 创建时间 2016/9/28 版本:V1.0
 */
public class StringUtil
{

    /**
     * 缩略展示字符串（保存1位小数），如1500展示为1.5k,1590展示为1.5k,15000展示为1.5w
     *
     * @param number
     *            需要缩略展示的数字
     * @return 缩略后的字符串
     */
    public static String friendlyShowNmber(int number)
    {
        if (number < 1000)
        {
            return "" + number;
        }
        else if (number < 10000)
        {
            number = number / 100;
            float d = (float) (number * 0.1);
            return d + "k";
        }
        else
        {
            number = number / 10000;
            return number + "w";
        }
    }

    /**
     * 判断字符串是否为空字符串，当字符为空，null，""，空格, 换行符，回车符以及制表符时均认为是空字符串
     *
     * @param input
     *            需检查的字符串
     * @return boolean 是否为空字符串 true：空字符串， false：非空字符串
     */
    public static boolean isEmpty(String input)
    {
        if (TextUtils.isEmpty(input) || "\"\"".equals(input)
                || "null".equals(input))
            return true;

        for (int i = 0; i < input.length(); i++)
        {
            char c = input.charAt(i);
            // 当字符为空格, 换行符，回车符以及制表符时认为是空字符串
            if (c != ' ' && c != '\t' && c != '\r' && c != '\n')
            {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断是否为符合电子邮箱地址格式的电子邮件地址
     *
     * @param email
     *            需要检查的邮箱地址
     * @return 是否为合法的邮箱地址 true：符合电子邮箱格式， false：不符合电子邮箱格式
     */
    public static boolean isEmail(String email)
    {
        if (TextUtils.isEmpty(email) || email.trim().length() == 0)
            return false;
        return Regular.REGULAR_EMAIL.matcher(email).matches();
    }

    /**
     * 字符串转整数
     *
     * @param str
     *            需转换的字符串
     * @param defValue
     *            转换失败时的默认值
     * @return 字符串转换后的整数
     */
    public static int stringToInt(String str, int defValue)
    {
        try
        {
            return Integer.parseInt(str);
        }
        catch (Exception e)
        {
        }
        return defValue;
    }

    /**
     * 对象转整数
     *
     * @param obj
     *            需转换的对象
     * @return 对象转换后的整数，当转换发生异常时返回0
     */
    public static int objectToInt(Object obj)
    {
        if (obj == null)
            return 0;
        return stringToInt(obj.toString(), 0);
    }

    /**
     * 字符串转长整数
     *
     * @param obj
     *            需转换的字符串
     * @return 对象转换后的长整型数据，当转换发生异常时返回0
     */
    public static long stringToLong(String obj)
    {
        try
        {
            return Long.parseLong(obj);
        }
        catch (Exception e)
        {
        }
        return 0;
    }

    /**
     * 字符串转boolean类型
     *
     * @param b
     *            需转换的字符串
     * @return 对象转换后的boolean型数据，当转换发生异常时返回false
     */
    public static boolean stringToBool(String b)
    {
        try
        {
            return Boolean.parseBoolean(b);
        }
        catch (Exception e)
        {
        }
        return false;
    }

    /**
     * 从流中读取string
     *
     * @param is
     *            输入流
     * @return 从输入流中读取到的信息
     */
    public static String convertStreamToString(InputStream is)
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try
        {
            while ((line = reader.readLine()) != null)
            {
                sb.append(line + "\n");
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                is.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }

        return sb.toString();
    }

    /**
     * 将字符串转换为List对象，默认使用，间隔
     * @param srcString 需要转换的String字符串
     *
     * @param split 间隔符
     * @return 转换后的List对象
     */
    public static List<String> StringToList(String srcString, String split)
    {
        List list = null;
        if (!isEmpty(srcString))
        {
            if (split == null)
            {
                split = ",";
            }
            String[] strArr = srcString.split(split);
            if ((strArr != null) && (strArr.length > 0))
            {
                list = new ArrayList(strArr.length);
                for (String str : strArr)
                {
                    list.add(str);
                }
            }
        }
        return list;
    }

    /**
     * 将数组转化为String字符串，默认使用,间隔
     * @param values 需要转换成字符串的数组
     * @param split 间隔符
     * @return 转换成字符串后的String对象
     */
    public static String arrayToString(String[] values, String split)
    {
        StringBuffer buffer = new StringBuffer();
        if (values != null)
        {
            if (split == null)
            {
                split = ",";
            }
            int len = values.length;
            for (int i = 0; i < len; i++)
            {
                buffer.append(values[i]);
                if (i != len - 1)
                {
                    buffer.append(split);
                }
            }
        }
        return buffer.toString();
    }

    /**
     * 验证手机号码（支持国际格式，+86135xxxx...（中国内地），+00852137xxxx...（中国香港））
     * @param mobile 移动、联通、电信、虚拟运营商的号码段
     *<p>移动的号段：134、135、136、137、138、139、147（预计用于TD上网卡）
     *、150、151、152、157（TD专用）、158、159、178，182，183，184，187、188（TD专用）</p>
     *<p>联通的号段：130、131、132、145、155、156（世界风专用）、171、175、176、185（未启用）、186（3g）</p>
     *<p>电信的号段：133、149、153、173、180、181、189</p>
     *<p>虚拟运营商：170</p>
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean isMobile(String mobile) {
        String regex = "(\\+\\d+)?((13[0-9])|(14[5,7,9])|(15[^4,\\D])|(17[0,1,3,5-8])|(18[0-9]))\\d{8}$";
        return Pattern.matches(regex,mobile);
    }

    /**
     * 验证固定电话号码
     * @param phone 电话号码，格式：国家（地区）电话代码 + 区号（城市代码） + 电话号码，如：+8602085588447
     * <p><b>国家（地区） 代码 ：</b>标识电话号码的国家（地区）的标准国家（地区）代码。它包含从 0 到 9 的一位或多位数字，
     *  数字之后是空格分隔的国家（地区）代码。</p>
     * <p><b>区号（城市代码）：</b>这可能包含一个或多个从 0 到 9 的数字，地区或城市代码放在圆括号——
     * 对不使用地区或城市代码的国家（地区），则省略该组件。</p>
     * <p><b>电话号码：</b>这包含从 0 到 9 的一个或多个数字 </p>
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean isPhone(String phone) {
        String regex = "(\\+\\d+)?(\\d{3,4}\\-?)?\\d{7,8}$";
        return Pattern.matches(regex, phone);
    }

}
